/**
 * 自动检测参数
 *
 * @Author bian
 * @CreateDate 2016.10.6
 *
 * @Example
 * check("unionId",["key","isUUID"])
 */
//todo : 变成中间件
var utilx = require("./utilx");

/**
 * 自动检测GET或者POST参数是否为空，根据是否是数组可以检测是否满足其他特性，如果错误则会抛出
 * @param ctx  ctx对象
 * @param args 待检测的参数
 */
var Check = function(ctx,...args){
    var method = ctx.request.method === "POST";
    for(var arg of args){
        if(Array.isArray(arg)){     // 如果是数组
            var c = method ? ctx.checkBody(arg[0]).notEmpty() : ctx.checkQuery(arg[0]).notEmpty();
            arg.forEach((e,idx) => {
                if(idx !== 0) {
                    c = c[e]();         // 继续检测
                }
            });
        }else if(typeof arg === "string"){
            method ? ctx.checkBody(arg).notEmpty() : ctx.checkQuery(arg).notEmpty();
        }
    }

    if(ctx.errors){
        ctx.body = utilx.msgWrapper(ctx.errors,true);
        throw new Error("参数错误");                // 直接抛出去，不再执行下面的代码
    }
};

/**
 * 检查参数是否为空，减少router路由代码中与逻辑无关代码
 * @param ctx
 * @param obj
 * @param tip
 * @param code
 */
var CheckNull = function(ctx,obj,tip,code){
    code = code || 0;
    if(utilx.isNullOrUndefined(obj)){
        ctx.body = utilx.msgWrapper(tip,true,code);
        throw new Error("不能为Null");
    }
};

/**
 * 检查对象不能为某个值
 * @param ctx
 * @param obj
 * @param value
 * @param tip
 * @param code
 */
var CheckCanNotBeEqual = function(ctx,obj,value,tip,code){
    code = code || 0;
    if(obj == value){       // 如果obj和value相等
        ctx.body = utilx.msgWrapper(tip,true,code);
        throw new Error("不能为Null");
    }
};
var CheckCanNotBe = CheckCanNotBeEqual;

/**
 * 检查两个值必须相等
 * @param ctx
 * @param obj
 * @param value
 * @param tip
 * @param code
 * @constructor
 */
var CheckShouldBeEqual = function(ctx,obj,value,tip,code){
    code = code || 0;
    if(obj != value){       // 如果obj和value不相等
        ctx.body = utilx.msgWrapper(tip,true,code);
        throw new Error("不能为Null");
    }
};

module.exports = {
    Check,
    CheckNull,
    CheckCanNotBe,
    CheckShouldBeEqual,
    CheckCanNotBeEqual
}